package cn.skyisazure.metacompare.other;

import cn.hutool.core.convert.ConvertException;
import cn.hutool.core.util.StrUtil;
import lombok.Getter;

/**
 * table:system_tenant_extra
 * 数据库方言 - 租户对应的平台所在数据库信息(name严格按照字典 database_type 取值)
 * @author study
 */
public enum SQLDialectEnum {

    /** mysql */
    MYSQL("com.mysql.cj.jdbc.Driver", "jdbc:mysql://{}:{}/{}"),
    DB2("com.ibm.db2.jcc.DB2Driver", "jdbc:db2://{}:{}/{}"),
    MARIADB("org.mariadb.jdbc.Driver", "jdbc:mariadb://{}:{}/{}"),
    ORACLE("oracle.jdbc.OracleDriver", "jdbc:oracle:thin:@//{}:{}/{}"),
    POSTGRE_SQL("org.postgresql.Driver", "jdbc:postgresql://{}:{}/{}"),
    SQL_SERVER("net.sourceforge.jtds.jdbc.Driver", "jdbc:jtds:sqlserver://{}:{}/{}");

    /** 驱动 */
    @Getter
    private final String driveClassName;
    /** url模板 */
    private final String urlTemplate;

    SQLDialectEnum(String clazz, String urlTemplate) {
        this.driveClassName = clazz;
        this.urlTemplate = urlTemplate;
    }

    /**
     * 获取默认数据库
     * @return
     */
    public static SQLDialectEnum Default() {
        return MYSQL;
    }

    /**
     * 驱动是否存在
     * （false则说明没加载对应数据库jar包
     * @return
     */
    public boolean validation() {
        try {
            Class.forName(driveClassName);
            return true;
        } catch (ClassNotFoundException e) {
            return false;
        }
    }

    /**
     * 获取连接url
     * @param host ip
     * @param port 端口
     * @param database 数据库
     * @return
     */
    public String getUrlTemplate(String host, String port, String database) {
        if (StrUtil.isAllNotBlank(host,port,database)) {
            return StrUtil.format(this.urlTemplate,host,port,database);
        }
        throw new ConvertException("Method parameter cannot be empty");
    }

}
